Skip to content

Clone a Document

1 Purpose

This example provides template and script to 'clone' a document. This can be useful for creating documents from templates with large numbers of fields where only one or two may change.

2 Template Example

Template: 

"components": [
        {
            "componentName": "sc-static-html",
            "fullWidth": true,
            "html": "<style>.formbirdIcon{float:right} .panel-A {background:#fffff;border:1px black;box-shadow: 10px 10px 5px grey;} .panel-A > .panel-heading {background:#6a99f4;color:white;font-size:1.25em;font-weight:200;padding:1px 1px 1px 10px} </style>",
            "name": "panelStyle"
        },
        {
            "componentName": "sc-static-html",
            "fullWidth": true,
            "label": "Clone An Asset",
            "name": "panel1",
            "wrapAction": "open",
            "wrapHtmlType": "wrap",
            "wrapClass": "panel-A"
        },
        {
            "componentName": "sc-related-document",
            "label": "Asset To Clone",
            "name": "cloneAssetRel",
            "filter": "{'query':{'bool':{'filter':[{'term':{'systemHeader.systemType': 'document'}},{'term':{'appTags':'asset'}}]}}}",
            "showDropDown": true,
            "singleSelection": true,
            "fullWidth": true,
            "disableSave": true
        },
        {
            "componentName": "sc-button",
            "caption": "Clone",
            "name": "cloneButton",
            "style": "btn-primary"
        },
        {
            "componentName": "sc-static-html",
            "label": "",
            "name": "panel1",
            "wrapHtmlType": "wrap",
            "wrapAction": "close"
        }
    ],

3 Script

{
#include "JayRule Ruleset Overlay JS",

    ruleset : {
        name : 'Clone Asset',

        ruleClone : {
            ruleCondition : function(ntf) {
                var fieldChanged = ntf.context.fieldChanged;

// related field from template ---> cloneAssetRel

               return (fieldChanged === 'cloneButton'
                && ntf.document.cloneAssetRel
                && ntf.document.cloneAssetRel.length);
            },

            ruleAction : function(ntf,callback) {
                var ft3=ntf.scope;
                var eqry = { 'query': { 'bool': { 'filter': [{ 'term': { 'documentId': ntf.document.cloneAssetRel[0].documentId }}] } } };
                ntf.logger.info('eqry ' + JSON.stringify(eqry));

                ft3.findDocumentsByElastic(eqry, ntf.context.user.documentId, function(err, result) {
                     if(err){
                         ntf.logger.info('Error: ' + err.message);
                     } else {
                         ntf.doc = result.data.hits.hits[0]._source;
                     }  
                    callback();
                  });
            }
        },

        ruleCreateNew : {
            ruleCondition : function(ntf) {
                   return (ntf.doc);
            },

        ruleAction : function(ntf,callback) {
            var ft3=ntf.scope;
            var tplId = ntf.doc.systemHeader.templateId;

    // example ..... remove fields          
                 delete ntf.doc.assetId;

    // example ..... update fields

                 var newDateCreated = new Date();
                 ntf.doc.dateCreated = newDateCreated;

    // must delete documentId and systemHeader from existing document           

            delete ntf.doc.documentId;
            delete ntf.doc.systemHeader;

            ntf.logger.info('template '+tplId);
            ntf.logger.info('doc '+JSON.stringify(ntf.doc));

            ft3.createDocumentFromTemplate(ntf.doc,tplId,ntf.user.documentId,function(err,doc){
                    if (err) {
                        ntf.logger.error('Error creating document: ' + err);
                    }
                    else {
                        ntf.logger.info('Document created: ' + doc.documentId);
                        var link = '<a href="/#/form/' + doc.documentId + '" target="_blank">'
                                + doc.systemHeader.summaryName + '</a><br/>';

                        ft3.ModalService.openModal({
                            title : 'Asset Created',
                            html : link,
                            type : 'info'
                        });
                    }
                    callback();
                });

                delete ntf.document.cloneAssetRel;
            }
        }
    }
}